
// 652. 寻找重复的子树
// 给定一棵二叉树，返回所有重复的子树。对于同一类的重复子树，你只需要返回其中任意一棵的根结点即可。

// 两棵树重复是指它们具有相同的结构以及相同的结点值。

// 示例 1：

//         1
//        / \
//       2   3
//      /   / \
//     4   2   4
//        /
//       4
// 下面是两个重复的子树：

//       2
//      /
//     4
// 和

//     4

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<TreeNode*> result;
    unordered_map<string,int> mp;
    string serialize(TreeNode* root)
    {
        string str;
        if(!root)
            return "null";
        str = to_string(root->val) + ' ' + serialize(root->left) + serialize(root->right);
        if(mp[str] == 1) result.push_back(root);
        mp[str] ++ ;
        return str;
    }
    vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) 
    {
        serialize( root);
        return result;
    }
};